﻿
namespace FastFood.Windows.Forms.Administracion.Comestibles
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Logic;
    using FastFood.Business.Entities;
    using FastFood.Windows.Helpers;

    public partial class CwfAlmacenamiento : UserControl
    {
        public List<Almacenamientos> ListaAlmacenes { get; set; }
        public EstadoActual estadoActual;
        private double stockActual;
        private int orden = -1;

        public CwfAlmacenamiento()
        {
            InitializeComponent();
        }

        private void CwfAlmacenamiento_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                ClearControls();
                LoadAlmacenes();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            this.cmbAlmacen.Enabled = true;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cmbAlmacen.Focus();
            this.almacenamientosBindingSource.AddNew();
            this.nudOrden.Maximum = almacenamientosBindingSource.Count;
            this.nudOrden.Value = this.nudOrden.Maximum;
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.cmbAlmacen.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (stockActual > 0)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "No se puede eliminar un almacen con stock mayor a 0");
            }
            else if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.almacenamientosBindingSource.Current != null)
                {
                    LoadAlmacenamiento(this.almacenamientosBindingSource.Current as Almacenamientos);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.almacenamientosBindingSource.Current != null)
                    {
                        LoadAlmacenamiento(this.almacenamientosBindingSource.Current as Almacenamientos);
                    }

                    EnabledControls(true);
                    EnabledButtons(true);
                    this.almacenamientosDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo || this.estadoActual == EstadoActual.Editar)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.almacenamientosBindingSource.CancelEdit();
            this.almacenamientosDataGridView.Focus();
        }

        private void insumosDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadAlmacenamiento(this.almacenamientosBindingSource.Current as Almacenamientos);
            }
        }

        private void preparacionDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.almacenamientosDataGridView.SelectedRows.Count != 0)
                {
                    if (stockActual > 0)
                    {
                        Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "No se puede eliminar un insumo con stock mayor a 0");
                    }
                    else if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.almacenamientosBindingSource.Current != null)
                        {
                            LoadAlmacenamiento(this.almacenamientosBindingSource.Current as Almacenamientos);
                        }
                    }
                }
            }
        }

        public void InitialLoad()
        {
            try
            {
                if (ListaAlmacenes == null) ListaAlmacenes = new List<Almacenamientos>();
                foreach (Almacenamientos item in ListaAlmacenes)
                {
                    item.orden = Convert.ToByte(ListaAlmacenes.IndexOf(item) + 1);
                }
                almacenamientosBindingSource.DataSource = new List<Almacenamientos>(ListaAlmacenes);

                if (orden > -1)
                {
                    almacenamientosBindingSource.Position = orden;
                    orden = -1;
                }
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        public void LoadAlmacenes()
        {
            try
            {
                cmbAlmacen.DataSource = new AlmacenesManager().Listar();
                cmbAlmacen.DisplayMember = "nombre";
                cmbAlmacen.ValueMember = "almacenID";
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadAlmacenamiento(Almacenamientos almacenamiento)
        {
            this.nudOrden.Maximum = almacenamientosBindingSource.Count;
            this.cmbAlmacen.SelectedValue = almacenamiento.almacenID;
            this.nudOrden.Value = almacenamiento.orden;
            this.loteIDLabel.Text = almacenamiento.loteID.ToString();
            this.stockActual = almacenamiento.stock;
            this.cmbAlmacen.Enabled = (stockActual == 0);
        }

        private bool SaveData()
        {
            Almacenamientos almacenamiento;
            bool result = false;

            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        almacenamiento = GetAlmacenamiento();
                        ListaAlmacenes.Insert(almacenamiento.orden - 1, almacenamiento);
                        orden = almacenamiento.orden - 1;
                        break;
                    case EstadoActual.Editar:
                        ListaAlmacenes.Remove(this.almacenamientosBindingSource.Current as Almacenamientos);
                        this.almacenamientosBindingSource.RemoveCurrent();
                        almacenamiento = GetAlmacenamiento();
                        ListaAlmacenes.Insert(almacenamiento.orden - 1, almacenamiento);
                        orden = almacenamiento.orden - 1;
                        break;
                    case EstadoActual.Eliminar:
                        ListaAlmacenes.Remove(this.almacenamientosBindingSource.Current as Almacenamientos);
                        this.almacenamientosBindingSource.RemoveCurrent();
                        break;
                }

                this.almacenamientosBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Almacenamientos GetAlmacenamiento()
        {
            return new Almacenamientos
            {
                loteID = Convert.ToInt32(loteIDLabel.Text),
                almacenID = Convert.ToInt16(cmbAlmacen.SelectedValue),
                orden = Convert.ToByte(nudOrden.Value),
                stock = stockActual,
                Almacenes = (Almacenes)cmbAlmacen.SelectedItem
            };
        }

        private bool ValidateData()
        {
            bool result = true;

            if (this.cmbAlmacen.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbAlmacen, "Seleccionar un Almacen.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbAlmacen, string.Empty);
            }

            if (this.nudOrden.Value == 0)
            {
                this.errValidator.SetError(this.nudOrden, "Indicar una Prioridad.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.nudOrden, string.Empty);
            }

            int act = almacenamientosDataGridView.CurrentRow.Index;
            for (int i = 0; i < ListaAlmacenes.Count; i++)
            {
                if (ListaAlmacenes[i].almacenID == Convert.ToInt16(cmbAlmacen.SelectedValue))
                {
                    if (i != act)
                    {
                        this.errValidator.SetError(this.cmbAlmacen, "Este insumo ya a sido asignado.");
                        result = false;
                        break;
                    }
                }
            }
            //foreach (Almacenamientos item in ListaPreparacion)
            //{
            //    if (item.insumoID == Convert.ToInt16(insumoIDLabel.Text))
            //    {
            //        if (i != ListaPreparacion. EstadoActual.Editar)
            //        {
            //            this.errValidator.SetError(this.insumoCmb, "Este insumo ya a sido asignado.");
            //            result = false;
            //            break;
            //        }
            //    }
            //}

            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.groupBox1.Enabled = !valor;
            this.almacenamientosDataGridView.Enabled = valor;
            if (!valor) this.nudOrden.Maximum = almacenamientosBindingSource.Count;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsbNuevo.Enabled = valor;
            this.TsbEditar.Enabled = valor;
            this.TsbEliminar.Enabled = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsbGuardar.Enabled = true;
                this.TsbCancelar.Enabled = true;
                this.almacenamientosDataGridView.Enabled = false;
            }
            else
            {
                this.TsbGuardar.Enabled = false;
                this.TsbCancelar.Enabled = false;
                this.almacenamientosDataGridView.Enabled = true;
            }
        }

        public void ClearControls()
        {
            loteIDLabel.Text = "-1";
            cmbAlmacen.SelectedIndex = -1;
            nudOrden.Value = 0;
            this.stockActual = 0;
            errValidator.Clear();
        }

        public void MenuSoloConImagenes(bool estado)
        {
            this.TsMenu.SuspendLayout();
            if (estado)
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.Image;
            }
            else
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
            }
            this.TsMenu.ResumeLayout();
        }

        private void cmbAlmacen_DropDown(object sender, EventArgs e)
        {
            short almacenID = Convert.ToInt16(cmbAlmacen.SelectedValue);
            LoadAlmacenes();
            cmbAlmacen.SelectedValue = almacenID;
        }
    }
}
